package xdu.lz.beanlife;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;


import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * TODO  如果某个类实现了BeanPostProcessor接口，那么该类的生命周期会在
 * registerBeanPostProcessors(beanFactory)时就执行，
 * 包括 创建实例，填充属性，执行setName，SetBeanFactory，init-method,afterProperties。
 * 因为需要先创建BeanPostProcessors对象，后期才能在实例化其他Bean的时候拦截
 * <p>
 * <p>
 */

public class User
		implements BeanNameAware
		, BeanFactoryAware
		, InitializingBean
		, DisposableBean {
	public User() {
		System.out.println("1user对象被实例化了..");
	}

	public void setUsername(@Autowired MyParam myParam) {
		System.out.println("2设置了username属性:" + myParam);
	}

	public void setBeanName(String s) {
		System.out.println("3 setBeanName被调用,设置Bean名字:" + s);
	}

	/**
	 * 由于BeanFactory在实例化user前已经存在，所以实例化user后，
	 * 执行populateBean依赖注入时，会注入到该方法中
	 */
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		System.out.println("4 setBeanFactory,获取Spring的Bean容器");
	}


	@PostConstruct  //该注解是在执行afterPropertiesSet之前
	public void postConstruct() {
		System.out.println("6、@PostConstruc方法");
	}

	public void afterPropertiesSet() throws Exception {
		System.out.println("7InitializingBean接口afterPropertiesSet,属性被设置完毕");
	}

	//init-method,该注解是在执行afterPropertiesSet之后
	public void my_init() {
		System.out.println("8、init-method方法");
	}

	@PreDestroy //该注解是在执行bean的close方法之前

	public void preDestroy() {
		System.out.println("10@PreDestroy，在bean的close前触发");
	}

	public void destroy() throws Exception {

		System.out.println("11 DisposableBean的执行destroy方法，在调用bean的close后触发");
	}

	public void my_destroy() {
		System.out.println("12自定义的destroy方法,destroy-method，在bean的close后触发，@Bean的destroyMethod注解");
	}


}
